home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HPAVC
/
HPAVC CD-ROM.iso
/
OTFLIP.ZIP
/
pageflip.doc
< prev
next >
Wrap
Text File
|
1996-02-23
|
7KB
|
155 lines
- THE OUTLAW TRIAD DEMO-SERIES -
────────────────────────────────■ PART III ■──────────────────────────────────
Written by : Vulture/OT
Code in : Pascal/Asm
Topic : Virtual screens
──────────────────────────────■ Introduction ■───────────────────────────────
Welcome to the Outlaw Triad demo-series! In these series we will be talking
about programming demo-effects in either pascal or assembler. Theory behind
the effects shall be discussed while a full sourcecode is also provided.
In this latest release we will be talking about the use of the socalled
virtual screens. These are very powerfull tools when coding demos or any
other graphic related program. A full sourcecode in Turbo Pascal is provided
in this package. Enjoy!
─────────────────────────────────■ Theory ■──────────────────────────────────
What exactly is a virtual screen? Well, a virtual screen is nothing more
than a piece of base-memory representing the VGA screen. So, when using
standard mode 13h, the virtual screen is 64000 bytes large. Because the
vga is 320*200=64000 bytes.
Now what can you do with a virtual screen? A major advantage of using these
virtual screens is that you can avoid bad flickering on the screen. The plan
is to update the data in memory and then flip it to the VGA. Updating the
VGA memory directly can cause a lot of "snow" on the screen. Suppose you are
writing a demo in which a lot of sprites and other things are moving on the
screen. But what happens if you want to have a picture in the background?
The picture would be erased because the sprites are drawn on top of it.
That's no good! Here we use a virtual screen.
You could do something like this:
1. - Draw the picture on the virtual screen.
2. - Flip (copy) the picture to the vga (old frames are erased).
3. - Wait for a vertical retrace (to make it even smoother).
4. - Draw your sprites on the vga (next frames).
5. - Back to 2.
So you see? This way your picture won't be erased at all! You constantly
copy your virtual page to the VGA before you write the next frame. You
might say that this is a rather slow way of doing things. This is true.
But better use slow tricks than having bad screen updates, right?
You should write your pageflipping routine(s) in assembler. Don't worry,
for those of you with little experience in coding asm, I have included
my own assembler routines. Those are pretty fast (using extended registers
for fast copying).
Anyway, how do we setup a virtual screen? Our source is in Pascal. Now,
in Pascal you may not have a single variable of 64000 bytes. That would
be too large. The solution is using pointers. Do it like this:
Type Virtual = Array[1..64000] of byte; { The size of our Virtual Screen }
VirPoint = ^Virtual; { Pointer to the virtual screen }
Var Virscr: VirPoint; { The actual virtual screen }
Vaddr : Word; { Segment of our virtual screen }
Procedure SetMemory; { Allocates memory }
Begin
GetMem(VirScr,64000); { 64000 bytes }
Vaddr := Seg(Virscr^);
End;
Procedure FreeMemory; { Frees the memory }
Begin
FreeMem(VirScr,64000);
End;
Ok, when you use "SetMemory" inside your program, it would setup 64000
bytes of base-memory for you to use and "Vaddr" would be pointing to the
segment of this memory (virtual screen). When your program is done, you
use "FreeMemory" to... well... free the memory. If you don't do that,
programs you run after you executed your own program have 64000 bytes
less to work with and that's no good. Now, right after you have setup
your virtual page, you must clear it from any garbage that might still
exist there. You can do that by writing 64000 zeros to that memory.
Examine the source to see what I mean.
All is fine sofar, but how do we actually access the virtual page?
Let me give you an example by plotting a pixel on the virtual page with
the "SetPixel" procedure. Here's the procedure in assembler:
Procedure SetPixel(X,Y:Integer;Color:Byte;Where:Word); Assembler;
Asm
mov ax,[Where]
mov es,ax { es:di => destination }
mov di,Y
mov ax,Y
shl di,8
shl ax,6
add di,ax { di = y*320 }
mov ax,X
add di,ax { di = (y*320)+x }
mov al,Color
mov byte ptr es:[di],al { Place dot }
End;
Let's say you want to have a pixel right in the middle of the virtual
screen. The exact place is calculated in the same manner as on the VGA,
that is (Y*320)+X. Why? Because base-memory, like VGA-memory, is lineair!
So, the middle of the screen would be X=160, Y=100. Let's say the color
is 1. Your total command would now be: SetPixel(160,100,1,Vaddr).
And that's it! Instead of pointing to the VGA's segment, you point to
the segment of the virtual screen. As you see it's very simple indeed.
Using base-memory is not the only way of using virtual screens. You can
also use plain VGA-memory for it. But in order to do that, you must use
an unchained VGA-mode. E.g, Mode Y has a resolution of 320*200*256 and
has got 4 pages (screens) available in display(vga) memory.
Read "chain4.doc" and "tweakdoc.txt" for more info on that. These are
textfiles written by me (Vulture/OT) on unchaining and tweaking the VGA.
Ok, now examine the source to see a quick example of virtual screens.
In the sample program I setup a virtual screen, fill it with random
pixels and wait for a keypress. Then I flip all data on the virtual
screen to the VGA. It's a short program but I am sure you can now see
the use and power of virtual screens. Btw, the assembler procedures
found here are very fast. Only thing I ask in return is that you greet
me or Outlaw Triad in your productions. Is that cheap or what? ;-)
In the future I might release a pageflipping program in 100% assembler.
Ok, this is all for now. Happy coding!
- Vulture / Outlaw Triad -
───────────────────────────────■ Distro Sites ■──────────────────────────────
Call our distros to get all our releases.
BlueNose World HQ +31 (0)345-619401
FireHouse Distrosite +31 (0)528-274176
The Force Distrosite +31 (0)36-5346967 More distros wanted!
MagicWare Italian HQ +39 6-52355532
ShockWave South African HQ +27 (011)888-6345
──────────────────────────────────■ Contact ■────────────────────────────────
Want to contact Outlaw Triad for some reason? You can reach us at our
distrosites in Holland. Or if you have e-mail access, mail us:
Vulture (coder/pr) comma400@tem.nhl.nl
Our internet homepage:
http://www.tem.nhl.nl/~comma400/vulture.html
These internet adresses should be valid at least till june 1996.
──────────────────────────────────────────────────────────────────────────────
Quote: Black holes are there where God divided by zero.